// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <ddk/debug.h>
#include <ddk/protocol/i2c.h>
#include <fbl/unique_ptr.h>

namespace audio {
namespace gauss {

class Tas57xx : public fbl::unique_ptr<Tas57xx> {
 public:
  static fbl::unique_ptr<Tas57xx> Create(i2c_protocol_t *i2c, uint32_t index);
  bool ValidGain(float gain);
  zx_status_t SetGain(float gain);
  zx_status_t GetGain(float *gain);
  zx_status_t Init(uint8_t slot);
  zx_status_t Reset();
  zx_status_t Standby();
  zx_status_t ExitStandby();

 private:
  friend class std::default_delete<Tas57xx>;
  static constexpr float kMaxGain = 24.0;
  static constexpr float kMinGain = -103.0;
  Tas57xx();
  ~Tas57xx();

  zx_status_t WriteReg(uint8_t reg, uint8_t value);

  zx_status_t SetStandby(bool stdby);

  i2c_protocol_t i2c_;

  float current_gain_ = 0;
};
}  // namespace gauss
}  // namespace audio
